/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.expertos;

import estructurassa.entidades.Proveedor;
import estructurassa.expertos.excepciones.ABMProveedorException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import persistencia.Conexion;
import persistencia.Fachada;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ExpertoABMProveedor implements Experto {

    public void guardar(Proveedor proveedor) throws ABMProveedorException {
        validarProveedor(proveedor);
        validarExistencia(proveedor);
        proveedor.setVigente(true);
        ExpertoCodigo expertoCodigo = ((ExpertoCodigo) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.GENERAR_CODIGO));
        proveedor.setCodigo(expertoCodigo.generarCodigo(proveedor));
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(proveedor);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            Conexion.getInstancia().deshacerTx();
            Logger.getLogger(ExpertoABMProveedor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public List buscarProveedores() {
        return Fachada.getInstancia().buscar(Proveedor.class, null);
    }

    public List buscarProveedores(String nombre, String codigo) {
        Criteria criterioNombre = Fachada.getInstancia().crearCriterio(Proveedor.class);

        if (!"".equals(nombre)) {
            criterioNombre.add(Restrictions.ilike("nombre", nombre));
        }
        if (!"".equals(codigo)) {
            criterioNombre.add(Restrictions.eq("nombre", nombre));
        }

        return Fachada.getInstancia().buscar(Proveedor.class, criterioNombre);
    }

    private void validarProveedor(Proveedor proveedor) throws ABMProveedorException {
        if (proveedor.getNombre().length() == 0) {
            throw new ABMProveedorException("Falta nombre");
        }

        if (proveedor.getDireccion().length() == 0) {
            throw new ABMProveedorException("Falta direeccion");
        }
        if (proveedor.getTelefono().length() == 0) {
            throw new ABMProveedorException("Falta telefono");
        }
    }

    private void validarExistencia(Proveedor proveedor) throws ABMProveedorException {
        Criteria nombreProveedor = Fachada.getInstancia().crearCriterio(Proveedor.class);
        nombreProveedor.add(Restrictions.eq("nombre", proveedor.getNombre()).ignoreCase());
        if (!Fachada.getInstancia().buscar(Proveedor.class, nombreProveedor).isEmpty()) {
            throw new ABMProveedorException("Proveedor ya existente");
        }
    }

    public void modificar(Proveedor proveedor) throws ABMProveedorException {
        validarProveedor(proveedor);
        proveedor.setVigente(true);

//        String codigo = ((ExpertoCodigo) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.GENERAR_CODIGO)).generarCodigoMaterial(material.getTipo());
//        material.setCodigo(codigo);
        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(proveedor);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            Conexion.getInstancia().deshacerTx();
            Logger.getLogger(ExpertoABMProveedor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public void darDeBaja(Proveedor proveedor) throws ExcepcionFachada {
        proveedor.setVigente(false);

        Fachada.getInstancia().guardar(proveedor);
    }

    public void actualizarProvedorPredeterminado(Proveedor proveedor) throws ExcepcionFachada {
        Criteria criterioProvVigActual = Fachada.getInstancia().crearCriterio(Proveedor.class);
        criterioProvVigActual.add(Restrictions.eq("predeterminado", true));
        List prov = Fachada.getInstancia().buscar(Proveedor.class, criterioProvVigActual);
        for (Object object : prov) {
            Proveedor provVig = ((Proveedor) object);
            provVig.setPredeterminado(false);
            Fachada.getInstancia().guardar(provVig);
        }


        proveedor.setPredeterminado(true);
        Fachada.getInstancia().guardar(proveedor);

    }
}
